package com.hy;

/**
 * Created With IntelliJ IDEA.
 * Descriptions:无重复字符的最长子串
 *
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串的长度。
 *
 * User:Mr.Du
 * Date:2024/8/17
 * Time:23:54
 */
public class LengthOfLongestSubstring {

    /**
     * 计算给定字符串中最长无重复字符的子串的长度
     * @param s 输入的字符串
     * @return 最长无重复字符子串的长度
     */
    public int lengthOfLongestSubstring(String s) {
        // 创建一个数组来存储每个字符出现的次数，ASCII码共有256个字符
        int[] nums = new int[256];
        // 初始化左指针l为0，字符串长度为n
        int l = 0, n = s.length();
        // 初始化结果变量res为0，用于记录最长无重复字符子串的长度
        int res = 0;
        // 遍历字符串中的每个字符，右指针r从0到n-1
        for(int r = 0; r < n; r++){
            // 获取当前右指针指向的字符
            char c = s.charAt(r);
            // 当前字符已出现过，进入循环
            while(nums[c] > 0){
                // 移动左指针，将左指针指向的字符在数组中对应的值设为0，表示未出现
                nums[s.charAt(l++)] = 0;
            }
            // 将当前字符在数组中对应的值设为1，表示出现过
            nums[c] = 1;
            // 更新结果变量res，取当前无重复字符子串长度和之前记录的最大长度的较大值
            res = Math.max(res, r - l + 1);
        }
        // 返回最长无重复字符子串的长度
        return res;
    }

}
